#!/usr/bin/perl
#
# Permite formatear correctamente un fichero de aliases del DHCP
# quitando los espacios estos tan molestos
#

# Comprobar argumentos...
if ( 0 != $#ARGV ) {
  print STDERR "ERROR: No has pasado el fichero a formatear\n";
  exit 2;
}

# Abrir fichero
open(LEASES,$ARGV[0]) || die "ERROR: No puedo abrir [".$ARGV[0]."]\n";

# Para la conversion de fechas
use Date::Parse;
# Para el formateo de IPs
use Socket;

$InLease=0;
$parentesis=0;
while( chomp($linea=<LEASES>) ) {
   if ( ($linea=~m/\{/) && ($linea!~m/\"/) ) {
      # Hay una apertura de llaves
      $parentesis++;

      # Comprobar si es el comienzo de un Lease
      if ( $linea=~m/^\s*lease\s+(\d\S+)\s+/ ) {
         $lease_IP="$1";
         $IPaton=&ip2dec($1);
         $InLease=1;
      }
   }elsif ( ($linea=~m/\}/) && ($linea!~m/\"/) ) {
      # Hay un cierre de llaves
      $parentesis--;

      if (( 1 == $InLease ) && ( 0 == $parentesis ) ) {
         $InLease=0;
         if (( "active" eq "$lease_state" ) && ("" ne "$lease_IP") && ("" ne "$lease_mac")) {
            print "$unixtime#$IPaton#$lease_mac#$lease_name#\@$lease_IP#$lease_start#$lease_state#\n";
         }
         $lease_name="..SIN_NOMBRE..";
         $lease_state="";
         $lease_start="";
         $lease_IP="";
         $lease_mac="";
      }
   }elsif ((1 == $InLease) && ($linea=~m/\s+starts\s+\d+\s+(\d[^\;]+)\;/))  {
      $lease_start=$1;
      $unixtime=str2time($1);
   }elsif ((1 == $InLease) && ($linea=~m/\s+hardware ethernet\s+(\S[^\;]+)\;/))  {
      $lease_mac=$1;
   }elsif ((1 == $InLease) && ($linea=~m/^\s+binding state\s+(\S[^\;]+)\;/))  {
      $lease_state=$1;
   }elsif ((1 == $InLease) && ($linea=~m/\s+client-hostname\s+\"([^\"]+)\"/))  {
      $lease_name=$1;
   }
}
close(LEASES);


# Funcion para formatear una direccion IP a numero ordenable
sub ip2dec ($) {
  return unpack N => pack CCCC => split /\./ => shift;
}

